package com.itheima.controller;

import com.itheima.common.R;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.util.UUID;

/**
 * @author Gareth Cao
 * @date 2022/4/29 9:58
 */
@RestController
@Slf4j
@RequestMapping("/common")
public class CommonController {

    @Value("${reggie.path}")
    private String basePath;

    /**
     * 图片上传
     * 方法参数名根据前端定义的name属性来写,没有就默认为file
     * 请求参数一定是post,格式是multifile/formdata
     */
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) throws Exception {
        //file文件是临时文件
        log.info("file: {}", file);

        //需要将上传的文件写入本地文件永久保存
        //判断basePath文件夹是否存在
        File f = new File(basePath);
        if (!f.exists()) {
            //不存在,则创建文件夹
            f.mkdirs();
        }
        //如果再上传同一个文件,会覆盖掉前面存储到本地文件的图片,因此需要更换名字
        //获取文件后缀名
        String suffixName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        //用uuid生成名称拼接上后缀名
        String fileName = UUID.randomUUID().toString() + suffixName;
        file.transferTo(new File(basePath + fileName));
        return R.success(fileName);
    }

    /**
     * 图片下载
     */
    @GetMapping("/download")
    public void download(@RequestParam("name") String fileName, HttpServletResponse response) throws Exception {
        //将存在本地文件的图片以流的形式发送给浏览器

        //1:获取字节输入流
        FileInputStream fis = new FileInputStream(new File(basePath + fileName));
        //2:获取响应的输出流
        ServletOutputStream sos = response.getOutputStream();
        //输入输出对接
        IOUtils.copy(fis, sos);
       /* byte[] bytes = new byte[1024 * 8];
        int len = 0;
        while ((len = fis.read(bytes)) > 0) {
            sos.write(bytes, 0, len);
        }*/
        //自己new的流关闭
        fis.close();
    }
}
